/**
 * @description Vuex模块：用户认证的token以及小程序code的储存
 * @author yinzhi
 * @date 2025-03-04
 */
import { logger } from '@/utils/log.js'
export default {
    // 开启命名空间
    namespaced: true,
    state: {
        token: '', // 用户凭证
        wxCode: '' // 微信登录code
    },
    getters: {
        token: state => state.token,
        isAudit: state => state.isAudit
    },
    mutations: {
        // 用户凭证写入
        setToken(state, token) {
            state.token = token
            uni.setStorageSync('token', token)
        },
        // 写入微信登录code
        setWxCode(state, wxCode = '') {
            state.wxCode = wxCode
        }
    },
    actions: {
        // 初始化时从本地缓存中获取token，防止刷新小程序丢失vuex中的信息
        async initAuth({ commit }) {
            try {
                const token = await uni.getStorageSync('token')
                commit('setToken', token)
            } catch (e) {}
        },
        // 初始化登录code
        async initWxCode({ commit }) {
            try {
                uni.login({
                    success(res) {
                        commit('setWxCode', res.code)
                        return res?.code || ''
                    },
                    fail(e) {
                        logger.error('[uni.login] 初始化获取code失败：', e)
                    }
                })
            } catch (error) {
                logger.error('[initWxCode] 初始化获取code失败：', error)
            }
        },
        /**
         * 判断微信code登录是否失效，失效后则重新获取
         * 一般用于一键获取手机号页面或者组件
         */
        async checkWxCode({ state, commit, dispatch }) {
            if (state.wxCode) {
                const res = await uni.checkSession()
                if (res.errMsg === 'checkSession:ok') {
                    return true
                } else {
                    commit('setWxCode', '')
                    await dispatch('initWxCode')
                    return false
                }
            } else {
                await dispatch('initWxCode')
                return false
            }
        },
        // 重置token 用于可以更新token的功能
        async resetAuth({ dispatch }, token) {
            await uni.setStorageSync('token', token)
            dispatch('initAuth')
        }
    }
}
